<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
        xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
        xmlns:fn  = "http://www.w3.org/2005/xpath-functions"
        xmlns:lib = "http://code.google.com/p/xstag/ns/test-lib/"
        >

<xsl:template name="lib:extractText" as="text()*">
  <xsl:param name="container" as="element()"/>
  <xsl:apply-templates select="$container" mode="lib:extractText"/>
</xsl:template>

<xsl:template match="*" mode="lib:extractText" as="text()*">
  <xsl:text> </xsl:text>
  <xsl:apply-templates select="*|text()" mode="lib:extractText"/>
  <xsl:text> </xsl:text>
</xsl:template>

<xsl:template match="text()" mode="lib:extractText" as="text()?">
  <xsl:sequence select="lib:checkText(.)"/>
</xsl:template>

<xsl:function name="lib:checkText" as="text()?">
  <xsl:param name="text" as="text()"/>
  <xsl:if test="fn:matches(fn:string($text),'\S')">
    <xsl:sequence select="$text"/>
  </xsl:if>
</xsl:function>

</xsl:stylesheet>